{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "CEM.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/DrLux/DRL-Evolution_Strategies-CEM-/blob/master/CEM.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "UJcHIij56GL2",
        "colab_type": "code",
        "outputId": "f6c79990-24ae-4f46-8b27-ee63e904b11f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 156
        }
      },
      "source": [
        "#remove \" > /dev/null 2>&1\" to see what is going on under the hood\n",
        "!pip install gym pyvirtualdisplay > /dev/null 2>&1\n",
        "!sudo apt-get install xvfb\n",
        "!apt-get install -y xvfb python-opengl ffmpeg > /dev/null 2>&1\n",
        "!apt-get update > /dev/null 2>&1\n",
        "!apt-get install cmake > /dev/null 2>&1\n",
        "!pip install --upgrade setuptools 2>&1\n",
        "!pip install ez_setup > /dev/null 2>&1\n",
        "!pip install Pyglet==1.3.2 "
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Reading package lists... Done\n",
            "Building dependency tree       \n",
            "Reading state information... Done\n",
            "xvfb is already the newest version (2:1.19.6-1ubuntu4.3).\n",
            "0 upgraded, 0 newly installed, 0 to remove and 76 not upgraded.\n",
            "Requirement already up-to-date: setuptools in /usr/local/lib/python3.6/dist-packages (41.2.0)\n",
            "Requirement already satisfied: Pyglet==1.3.2 in /usr/local/lib/python3.6/dist-packages (1.3.2)\n",
            "Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from Pyglet==1.3.2) (0.16.0)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4YYJsq_j4wc3",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from collections import deque\n",
        "import numpy as np\n",
        "import gym\n",
        "import time\n",
        "import matplotlib.pyplot as plt\n",
        "import glob\n",
        "import io\n",
        "import base64\n",
        "\n",
        "\n",
        "from IPython.display import HTML\n",
        "from gym.wrappers import Monitor\n",
        "from IPython import display as ipythondisplay"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wGIZI16x6JIH",
        "colab_type": "code",
        "outputId": "3fef5b9f-c1b4-45f9-9dc7-844016b8bc56",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 72
        }
      },
      "source": [
        "from pyvirtualdisplay import Display\n",
        "display = Display(visible=0, size=(1400, 900))\n",
        "display.start()"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "xdpyinfo was not found, X start can not be checked! Please install xdpyinfo!\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<Display cmd_param=['Xvfb', '-br', '-nolisten', 'tcp', '-screen', '0', '1400x900x24', ':1001'] cmd=['Xvfb', '-br', '-nolisten', 'tcp', '-screen', '0', '1400x900x24', ':1001'] oserror=None return_code=None stdout=\"None\" stderr=\"None\" timeout_happened=False>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 3
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_cBBZjZp7PL-",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "\"\"\"\n",
        "Utility functions to enable video recording of gym environment and displaying it\n",
        "To enable video, just do \"env = wrap_env(env)\"\"\n",
        "\"\"\"\n",
        "\n",
        "def show_video():\n",
        "  mp4list = glob.glob('video/*.mp4')\n",
        "  if len(mp4list) > 0:\n",
        "    mp4 = mp4list[0]\n",
        "    video = io.open(mp4, 'r+b').read()\n",
        "    encoded = base64.b64encode(video)\n",
        "    ipythondisplay.display(HTML(data='''<video alt=\"test\" autoplay \n",
        "                loop controls style=\"height: 400px;\">\n",
        "                <source src=\"data:video/mp4;base64,{0}\" type=\"video/mp4\" />\n",
        "             </video>'''.format(encoded.decode('ascii'))))\n",
        "  else: \n",
        "    print(\"Could not find video\")\n",
        "    \n",
        "\n",
        "def wrap_env(env):\n",
        "  env = Monitor(env, './video', force=True)\n",
        "  return env"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xcN8LxMI4xwT",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "#Parameters\n",
        "\n",
        "GENERATIONS   = 100\n",
        "POPULATION    = 200\n",
        "elite         = 0.2 # percentage of the population we want preserve\n",
        "std           = 1 # scale of standard deviation"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "z2qpHXA0XHdZ",
        "colab_type": "text"
      },
      "source": [
        "![alt text](https://github.com/DrLux/DRL-Evolution_Strategies-CEM-/blob/master/unnamed.png?raw=true)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "0CJOcc-pr0G_",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Using CEM to maximize the \"evaluate_plan\" result \n",
        "def update_param(theta_mean,theta_std,top_per,batch_size,env):\n",
        "    #theta: list of \"batch_size\" vectors each one length \"obs\"\n",
        "    #create a theta in mean and then add a std + gaussian noise\n",
        "    #shape (batch_size, env.observation_space.shape[0])\n",
        "    theta_sample = np.tile(theta_mean, (batch_size, 1)) + np.tile(theta_std, (batch_size, 1)) * np.random.randn(batch_size, theta_mean.size)\n",
        "    reward_sample = np.array([evaluate_plan(env, th)[0] for th in theta_sample])\n",
        "\n",
        "    # get the index of 2% best thetas\n",
        "    top_idx = np.argsort(-reward_sample)[:int(np.round(batch_size * top_per))]\n",
        "    top_theta = theta_sample[top_idx]\n",
        "\n",
        "    #update theta\n",
        "    theta_mean = top_theta.mean(axis = 0)\n",
        "    theta_std = top_theta.std(axis = 0) \n",
        "    return theta_mean,theta_std\n",
        "\n",
        "def evaluate_plan(env, theta):\n",
        "    total_rewards = 0\n",
        "    observation = env.reset()\n",
        "    for t in range(env._max_episode_steps):\n",
        "        action = get_action(observation, theta)\n",
        "        observation, reward, done, _ = env.step(action)\n",
        "        total_rewards += reward\n",
        "        if done: break\n",
        "    return total_rewards, t\n",
        "\n",
        "# Define the policy network (just 1 layer) \n",
        "def get_action(ob,weights):\n",
        "    W1 = weights[:-1]\n",
        "    b1 = weights[-1]\n",
        "    return int((ob.dot(W1) + b1) < 0)\n",
        "\n",
        "# Core function to evolve agent according to Cross Entropy Method\n",
        "def evolve_agent(env):\n",
        "\n",
        "    plot_data = []\n",
        "\n",
        "    # initialize parameters\n",
        "    theta_mean = np.zeros(env.observation_space.shape[0] + 1)\n",
        "    theta_std = np.ones_like(theta_mean) * std\n",
        "\n",
        "\n",
        "    #Buffer list for statistics\n",
        "    episode_history = deque(maxlen=100) \n",
        "    \n",
        "    for itr in range(GENERATIONS):\n",
        "        theta_mean,theta_std = update_param(theta_mean,theta_std,elite,POPULATION,env)\n",
        "        total_rewards, t = evaluate_plan(env, theta_mean)\n",
        "\n",
        "        episode_history.append(total_rewards)\n",
        "        mean_rewards = np.mean(episode_history)\n",
        "        plot_data.append(mean_rewards)\n",
        "\n",
        "        print(\"Episode {}\".format(itr))\n",
        "        print(\"Finished after {} timesteps\".format(t+1))\n",
        "        print(\"Reward for this episode: {}\".format(total_rewards))\n",
        "        print(\"Average reward for last 100 episodes: {}\".format(mean_rewards))\n",
        "        # Leaderboard treshold to win the env: https://github.com/openai/gym/wiki/CartPole-v0\n",
        "        if mean_rewards >= 195.0:\n",
        "            print(\"Environment solved after {} episodes\".format(itr+1))\n",
        "            break\n",
        "    env.close()\n",
        "    return theta_mean,theta_std, plot_data\n",
        "\n",
        "# Show an episode of the trained agent\n",
        "def show_agent(env,theta_mean,theta_std):\n",
        "    theta = theta_mean + (theta_std * np.random.randn(theta_mean.size))\n",
        "\n",
        "    observation = env.reset()\n",
        "    done = False\n",
        "    total_rewards = 0\n",
        "    \n",
        "    while not done:\n",
        "        action = get_action(observation, theta)\n",
        "        observation, reward, done, _ = env.step(action)\n",
        "        total_rewards += reward\n",
        "        time.sleep(0.008)\n",
        "        env.render()\n",
        "\n",
        "    env.close()\n",
        "    print(\"Final Reward: \",total_rewards)\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "gAtC_tJ-44TD",
        "colab_type": "code",
        "outputId": "7cc5c80b-2ccb-411b-c95a-a367a3804cb9",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "source": [
        "env_name = 'CartPole-v0'\n",
        "theta_mean,theta_std,plot_data = evolve_agent(gym.make(env_name))"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Episode 0\n",
            "Finished after 61 timesteps\n",
            "Reward for this episode: 61.0\n",
            "Average reward for last 100 episodes: 61.0\n",
            "Episode 1\n",
            "Finished after 190 timesteps\n",
            "Reward for this episode: 190.0\n",
            "Average reward for last 100 episodes: 125.5\n",
            "Episode 2\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 150.33333333333334\n",
            "Episode 3\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 162.75\n",
            "Episode 4\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 170.2\n",
            "Episode 5\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 175.16666666666666\n",
            "Episode 6\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 178.71428571428572\n",
            "Episode 7\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 181.375\n",
            "Episode 8\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 183.44444444444446\n",
            "Episode 9\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 185.1\n",
            "Episode 10\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 186.45454545454547\n",
            "Episode 11\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 187.58333333333334\n",
            "Episode 12\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 188.53846153846155\n",
            "Episode 13\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 189.35714285714286\n",
            "Episode 14\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 190.06666666666666\n",
            "Episode 15\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 190.6875\n",
            "Episode 16\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 191.23529411764707\n",
            "Episode 17\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 191.72222222222223\n",
            "Episode 18\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 192.1578947368421\n",
            "Episode 19\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 192.55\n",
            "Episode 20\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 192.9047619047619\n",
            "Episode 21\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 193.22727272727272\n",
            "Episode 22\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 193.52173913043478\n",
            "Episode 23\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 193.79166666666666\n",
            "Episode 24\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 194.04\n",
            "Episode 25\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 194.26923076923077\n",
            "Episode 26\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 194.4814814814815\n",
            "Episode 27\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 194.67857142857142\n",
            "Episode 28\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 194.86206896551724\n",
            "Episode 29\n",
            "Finished after 200 timesteps\n",
            "Reward for this episode: 200.0\n",
            "Average reward for last 100 episodes: 195.03333333333333\n",
            "Environment solved after 30 episodes\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yxttqvqw5hQL",
        "colab_type": "code",
        "outputId": "906c249a-5150-4ea9-d21c-b3954c394a69",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 269
        }
      },
      "source": [
        "plt.plot(plot_data)\n",
        "plt.show()"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nufgQhwEAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ASyxMITX47IQ",
        "colab_type": "code",
        "outputId": "09ee2e9a-8da2-43d1-bd63-39a44789bfc4",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 439
        }
      },
      "source": [
        "show_agent(wrap_env(gym.make(env_name)),theta_mean,theta_std)\n",
        "display.stop()\n",
        "show_video()"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Final Reward:  200.0\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "text/html": [
              "<video alt=\"test\" autoplay \n",
              "                loop controls style=\"height: 400px;\">\n",
              "                <source src=\"data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAMsttZGF0AAACrgYF//+q3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1MiByMjg1NCBlOWE1OTAzIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNyAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAABn2WIhAAz//727L4FNf2f0JcRLMXaSnA+KqSAgHc0wAAAAwAAAwAAFgn0I7DkqgN3QAAAHGAFBCwCPCVC2EhH2OkN/yzTuFsAcrmYxG/TE2nwdnw1Ym07fNUSyEdlHXffiYHRivj2m4v8zyIQjL3StBmMZ7rk1CqhvXJTWSvTA+Gzj4ZH+kRITC5sD6EyY2AxQaJMt8BR8ChsFH5ICGfT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AAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAMAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAADJAAAAAQAAAzhzdHN6AAAAAAAAAAAAAADJAAAEVQAAALMAAABFAAAALwAAAC8AAACFAAAAOwAAACgAAAAnAAAAaQAAAEMAAAArAAAALAAAAHwAAABFAAAAKAAAAC4AAABbAAAAUAAAADEAAAA0AAAAgQAAAEMAAAA/AAAAWwAAAF0AAABDAAAANgAAAEsAAAA8AAAAPQAAACoAAABmAAAAOAAAAC0AAAAhAAAAiQAAAD0AAAApAAAAMwAAAGwAAABmAAAATgAAAEwAAAAuAAAAawAAAFUAAAAmAAAALQAAAFgAAAAtAAAALAAAABwAAAA5AAAAJwAAACAAAAAXAAAAbgAAACUAAAAkAAAAGgAAAFcAAAAsAAAALgAAACwAAABcAAAAPgAAACcAAAAuAAAAXAAAAE0AAAA5AAAAMAAAAEsAAABIAAAALwAAACgAAACQAAAAOgAAADYAAAArAAAAaAAAADUAAAAsAAAAJQAAAEgAAAA1AAAAbAAAADAAAAAmAAAAGQAAAEUAAABCAAAAJwAAACMAAABCAAAALAAAACMAAAAgAAAAUwAAACgAAAAbAAAALAAAAG8AAAAvAAAAMwAAACkAAABiAAAAOQAAABwAAAAtAAAAUgAAADMAAAA0AAAAJAAAAFUAAAAzAAAANQAAACUAAAA+AAAAMgAAADoAAAAwAAAAVAAAACsAAAAiAAAAHQAAAEoAAABIAAAAJgAAADIAAABIAAAAMAAAACUAAAAfAAAAfwAAAC4AAAAiAAAAJgAAAEkAAAAqAAAAHQAAACQAAAAqAAAAMAAAAD8AAAAyAAAANQAAADIAAAA7AAAALAAAACAAAAAqAAAAMwAAAEsAAAAwAAAAIgAAAEoAAABQAAAAIwAAACUAAACHAAAAKgAAACYAAAA5AAAAWQAAADkAAAAeAAAANAAAAHEAAAA2AAAALwAAACYAAAB0AAAAJQAAAE8AAABGAAAAMgAAADYAAAA3AAAANQAAACsAAAAkAAAAZQAAACkAAAAgAAAALwAAAD0AAAA3AAAAHQAAADAAAABOAAAAPAAAADEAAAA1AAAAXgAAAEEAAAAvAAAAMAAAAD4AAAAsAAAAFHN0Y28AAAAAAAAAAQAAADAAAABidWR0YQAAAFptZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0b28AAAAdZGF0YQAAAAEAAAAATGF2ZjU3LjgzLjEwMA==\" type=\"video/mp4\" />\n",
              "             </video>"
            ],
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    }
  ]
}